// Copyright 2022 jeff.li. and/or its affiliates.

#pragma once

#include <memory>

#include <tbir/pipeline/node.h>
#include <tbir/pipeline/op_kernel.h>
#include <tbir/runtime/container.h>
#include <tbir/runtime/container/_flat_hash_map.h>

namespace tbir::runtime {

    struct SymbolicExecutor {
        static std::vector<std::unique_ptr<Symbol>> Compose(
                OpKernelPtr op,
                const std::vector<const Symbol *> &args,
                const ska::flat_hash_map<String, const Symbol *> &kwargs,
                int num_output);

        static inline std::vector<std::unique_ptr<Symbol>> Compose(OpKernelPtr op,
                                                                   const std::vector<const Symbol *> &args,
                                                                   int num_output) {
            static ska::flat_hash_map<String, const Symbol *> kwargs{};
            return Compose(op, args, kwargs, num_output);
        }
    };

}  // namespace tbir::runtime
